www.gusucode.com > VC++ MFC绘图类实战笔记源代码-源码程序 > VC++ MFC绘图类实战笔记源代码-源码程序/code/20110107/day09.txt

    一 MFC序列化

  1 对象的序列化(反序列化)
   
    1.1 对象的序列化的使用
      1.1.1 定义支持序列化的类
      1)是CObject的子孙类
      2)添加支持序列化的宏
        DECLARE_SERIAL
        IMPLEMENT_SERIAL
      3)要重写函数Serialize
        virtual void Serialize( CArchive& ar );
      1.1.2 创建文件
      1.1.3 定义CArchive
      1.1.4 存储对象
      1.1.5 关闭CArchive
      1.1.6 关闭文件
    
    1.2 序列化的实现
      1.2.1 宏代码
      class CAnimal : public CObject
    	{
    		_DECLARE_DYNCREATE( CAnimal )
				AFX_API friend CArchive& AFXAPI 
    			operator>>(CArchive& ar, CAnimal * &pOb);
    	}
    	
    	CObject* PASCAL CAnimal::CreateObject()
			{ 
			    return new CAnimal; 
			} 
			_IMPLEMENT_RUNTIMECLASS( CAnimal, CObject, 0, 
					CAnimal::CreateObject )
			
			AFX_CLASSINIT _init_CAnimal( RUNTIME_CLASS(CAnimal) ); 
			
			CArchive& AFXAPI operator>>(CArchive& ar, CAnimal* &pOb)
			{ 
			    pOb = (CAnimal*) 
			        ar.ReadObject(RUNTIME_CLASS(CAnimal)); 
				return ar; 
			}
      
  	1.2.2 说明
      
     1)_DECLARE_DYNCREATE 动态创建类
     2)operator>> 读入操作符,读取对象
       数据。不是CAnimal类的成员函数,
       是一个CAnimal类的友员全局函数。
     3) AFX_CLASSINIT _init_CAnimal
       全局变量,在程序启动的时候被创建。
       将CAnimal类RUNTIMECLASS信息
       注册到程序中(保存到数据链表).
       
    1.2.3 执行过程
      
      初始化:
      1) _init_CAnimal变量初始化,在构造
       函数中,将类的CRuntimeClass地址
       保存到程序AFX_MODULE_STATE的
       全局变量中,使用m_classList保存
       这个地址.
      
      写入数据:
      
      2) 使用"<<"写入对象数据,内部调用
       CArchive的WriteObject函数.
      
      3) 在WriteObject函数,将该对象的
       CRuntimeClass信息中的版本号/
       类名称写入到文件.
       
      4) 调用对象的Serialize,保存对象
       内的相关数据.
      
      读取数据:
      5) 使用">>"读取对象数据,实际调用
       的是该类的友员函数
       (即在序列化宏中定义操作符).
      
      6) 在">>"操作符中调用CArchive的
       ReadObject函数读取对象.
       
      7) 在ReadObject中从文件中读取
       版本号和类名称
      
      8) 根据读取的类名称,从m_classList
       中,查找相应的CRuntimeClass的地址
       
      9) 获取到CRuntimeClass地址,使用
        CRuntimeClass的CreateObject函数
        创建该类的对象.
        
      10) 调用对象的Serialize函数,从
        CArchive中读取对象内的数据.
    
    1.3 类的Schema(版本)
      
      1.3.1 通过IMPLEMENT_SERIAL宏
      的第3个参数Schema来控制类的版本
      1.3.2 定义版本时,需要增加
        VERSIONABLE_SCHEMA
      例如: 
        IMPLEMENT_SERIAL( CAnimal, CObject, VERSIONABLE_SCHEMA|1 )
      1.3.3 读取数据时,要增加版本
        判断处理
        CArachive::GetObjectSchema获取
        当前对象的版本号.
      
二 MFC对话框

  1 MFC对话框
    
    1.1 有模式对话框
    1.2 无模式对话框
    
  2 MFC APP对话框的使用
    2.1 对话框窗口
    2.2 应用程序主窗口
 
  3 有模式对话框的使用
    3.1 使用
      3.1.1 定义对话框资源
      3.1.2 定义对话框类
      	基于CDialog父类生成子类,将对话框
      	的资源ID通过构造函数传递给CDialog
      3.1.3 显示对话框
        int CDialog::DoModal()
      3.1.4 WM_INITDIALOG映射为OnInitDialog
        在这个函数中完成对话框数据的初始化
      3.1.5 消息映射
        使用消息映射宏完成消息处理 
      3.1.6 对话框的关闭
        CDialog::OnOK - 确定的方式关闭,
          DoModal函数返回IDOK
        CDialog::OnCancel - 取消的方式关闭,
          DoModal函数返回IDCANCEL
        CDialog::EndDialog - 关闭并指定
          返回值
    3.2 DoModal执行 
      3.2.1 查找对话框资源
      3.2.2 将父窗口设置成禁止输入状态
      3.2.3 创建对话框窗口
      3.2.4 调用消息循环,等候对话框关闭
         执行3.2.5
      3.2.5 将自己的窗口隐藏
      3.2.6 将父窗口设置激活窗口
      3.2.7 删除对话框窗口
      3.2.8 返回对话框结束参数
      
  4 无模式对话框
    4.1 使用
      4.1.1 定义对话框资源
      4.1.2 定义对话框类
      	基于CDialog父类生成子类
      4.1.3 创建对话框
        CDialog::Create创建对话框
      4.1.4 显示对话框
        CDialog::ShowWindow显示
      4.1.5 对话框的关闭
        需要手动添加DestoryWindow函数
        可以在OnOK/OnCancel当中
    4.2 执行
      4.2.1 查找资源
      4.2.2 创建窗口